# Python 推导式
# 推导式是一种简洁的表达式，可以用来创建列表、字典、集合、元组等数据结构。

# 列表推导式
# 语法：
# [expression for item in iterable if condition]
# 表达式(expression)：对每个 item 进行计算的表达式
# 迭代对象(iterable)：可迭代对象，如列表、元组、字符串等
# 条件(condition)：可选的，对 item 进行过滤的条件

# 例子：计算 1 到 10 之间的偶数的平方
# 循环序列1~10，如果是偶数，则计算它的平方并添加到列表中
squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print("列表推导式1:", type(squares), squares)  # [4, 16, 36, 64, 100]
# 创建一个新的列表，包含 1 到 5 的三次方
print("列表推导式2:", [x ** 3 for x in range(1, 5)])


# 字典推导式
# 语法：
# {key_expression:value_expression for item in iterable if condition}
# 键表达式(key_expression)：对每个 item 进行计算的键
# 值表达式(value_expression)：对每个 item 进行计算的值
# 迭代对象(iterable)：可迭代对象，如列表、元组、字符串等
# 条件(condition)：可选的，对 item 进行过滤的条件

# 例子：计算 1 到 10 之间的偶数的平方
# 循环序列1~10，如果是偶数，则计算它的平方并添加到字典中
dict1 = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print("字典推导式1:", type(dict1), dict1)  # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
# 创建一个新的字典，包含 1 到 5 的键值对
print("字典推导式2:",{x: x ** 3 for x in range(1, 5)})


# 集合推导式
# 语法：
# {expression for item in iterable if condition}
# 表达式(expression)：对每个 item 进行计算的表达式
# 迭代对象(iterable)：可迭代对象，如列表、元组、字符串等
# 条件(condition)：可选的，对 item 进行过滤的条件

# 例子：计算 1 到 10 之间的偶数的平方
# 循环序列1~10，如果是偶数，则计算它的平方并添加到集合中
set1 = {x**2 for x in range(1, 11) if x % 2 == 0}
print("集合推导式1:", type(set1), set1)  # {4, 16, 36, 64, 100}
# 创建一个新的集合，包含 1 到 5 的三次方
print("集合推导式2:", {x ** 3 for x in range(1, 5)})


# 元组推导式
# 语法：
# (expression for item in iterable if condition)
# 表达式(expression)：对每个 item 进行计算的表达式
# 迭代对象(iterable)：可迭代对象，如列表、元组、字符串等
# 条件(condition)：可选的，对 item 进行过滤的条件

# 例子：计算 1 到 10 之间的偶数的平方
# 循环序列1~10，如果是偶数，则计算它的平方并添加到元组中
generator1 = (x**2 for x in range(1, 11) if x % 2 == 0)  # 注意：元组推导式返回的是生成器对象
print("元组推导式1:", type(generator1), tuple(generator1))  # <class 'generator'> (4, 16, 36, 64, 100)
# 创建一个新的元组，包含 1 到 5 的三次方
print("元组推导式2:", tuple((x ** 3 for x in range(1, 5))))


# 嵌套推导式
# 列表推导式、字典推导式、集合推导式、元组推导式可以嵌套使用
# 语法：
# [expression for item1 in iterable1 for item2 in iterable2 if condition]
# {key_expression:value_expression for item1 in iterable1 for item2 in iterable2 if condition}
# {expression for item1 in iterable1 for item2 in iterable2 if condition}
# (expression for item1 in iterable1 for item2 in iterable2 if condition)
